package concurrent.result;

import concurrent.domain.Result;
import concurrent.domain.Slave;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

/**
 * join是线程的实例方法，调用别的现成的join，可以让当前线程等待，直到别人的join完成工作
 * 局限性： 如果别的线程也需要获取其他线程的结果，就不好用了
 */
public class ResultByJoin {
    //用于封装结果
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println(System.currentTimeMillis());
        //用于存放子线程执行的结果
        Result<List<Slave>> result = new Result<>();
        result.setResult(new ArrayList<>(2));
        //创建一个子线程
        Thread thread = new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
                Slave slave = new Slave();
                slave.setName("杨玉帆");
                slave.setAge(18);
                slave.setDesc("杨玉帆喜欢口交");
                result.getResult().add(slave);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        thread.start();
        //创建一个子线程
        Thread thread2 = new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(8);
                Slave slave = new Slave();
                slave.setName("陈婉红");
                slave.setAge(19);
                slave.setDesc("陈婉红是小母狗");
                result.getResult().add(slave);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        thread2.start();
        //让主线程等待thread线程执行完毕之后再继续，join方法会让当前线程(主线程)阻塞
        //这里需要用执行时间长的线程去join，有些情况下
        /**
         * 注意点：
         * 1.thread.join,thread2.join 是把当前主线程放到了两个对象的monitor中
         * 2.可以用执行时间长的线程去join。比如thread2，但是不能用时间短的去join，否则拿不到执行时间长的数据
         * 3.实际开发中不知道哪个线程执行时间长，所以两个都join
         */
        thread.join();
        thread2.join();

        //获取thread线程的执行结果
        System.out.println(System.currentTimeMillis());
        System.out.println(System.currentTimeMillis() + ":" + result.getResult());
    }
}
